/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.segu.manager;

import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.CorreoDto;
import com.brain.core.dto.EmpresaDto;
import com.brain.core.exception.DAOException;
import com.brain.core.exception.ServiceException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.manager.ComunManager;
import com.brain.core.manager.CorreoElectronicoManager;
import com.brain.core.manager.ParametroManager;
import com.brain.core.manager.PropietarioManager;
import com.brain.core.manager.RecursosManager;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.PropietarioMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.core.view.util.ConstantesCore;
import com.brain.segu.dto.PermisoRolDto;
import com.brain.segu.dto.UsuarioDto;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.faces.context.FacesContext;
import javax.mail.MessagingException;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 *
 * @author Indra
 */
@Service
public class UsuarioManager extends ComunManager<UsuarioDto> implements Serializable {

    @Resource
    private DAOGenerico<UsuarioDto> springHibernateDao;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private PropietarioManager propietarioManager;
    @Resource
    private RolManager rolManager;
    private final Long idUsuarioSystem = 0L;
    private final Long usuarioTodos = 10005L;
    private final Long IdEntidad = 11L;
    private UsuarioDto usuarioSystem;
    public final String urlUsuarioFormatearContrasena = "/pages/segu/usuario/formatearContrasena.xhtml";
    public final String urlUsuarioCambiarContrasena = "/pages/segu/usuario/cambiarContrasena.xhtml";
    public final String urlUsuario = "/pages/segu/usuario/usuario.xhtml";
    public final String urlListaUsuarios = "/pages/segu/usuario/listaUsuarios.xhtml";
    private static Logger logger = org.apache.log4j.Logger.getLogger(UsuarioManager.class);
    //Datos del usuario default de cada empresa
    private final String login = "SYSTEM";
    private final String contrasenia = "MONACO";
    private final String usuarioDesc = "USUARIO ADMINISTRADOR";

    /**
     * Retorna un Usuario por su Id
     *
     * @param id Id Usuario
     * @return Usuario
     * @throws DAOException
     */
    public UsuarioDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(UsuarioDto.class, id);
    }
    
    public List<UsuarioDto> obtenerTodos() throws DAOException {
        return springHibernateDao.listarTodosDtos(UsuarioDto.class);
    }

    /**
     * Valida si el login de un usuario ya se encuentra en el sistema o no
     *
     * @param usuarioDto Usuario a validar
     * @return verdadero (es vàlido porque no se encuentra) o falso (no es
     * valido porque ya se encuentra)
     */
    public boolean esValidoLogin(UsuarioDto usuarioDto) {
        boolean retorno = false;
        try {

            List<Object> listaParametros = new ArrayList<Object>();
            String hqsql = "select p from UsuarioDto as p where ";
            hqsql += " upper(p.login) = '" + usuarioDto.getLogin().toUpperCase() + "'";
            if (usuarioDto.getId() != null) {
                hqsql += " and p.id != " + usuarioDto.getId();
            }

            List<UsuarioDto> usuarios = springHibernateDao.ejecutarQuery(hqsql, listaParametros);
            if (usuarios != null && usuarios.size() > 0) {
                retorno = false;
            } else {
                retorno = true;
            }

        } catch (DAOException ex) {
            logger.error(ex);
            retorno = false;
        }

        return retorno;
    }

    /**
     * Valida el logeo del usuario
     *
     * @param usuarioDto
     * @return
     */
    public UsuarioDto login(String usr, String pwd, Long empresa) {
        UsuarioDto retorno = null;
        try {

            List<Object> listaParametros = new ArrayList<Object>();
            String hqsql = "select p from UsuarioDto as p where ";
            hqsql += " (upper(p.login) = '" + usr.toUpperCase() + "'";
            hqsql += " or upper(p.emailLaboral) = '" + usr.toUpperCase() + "')";

            hqsql += " and upper(p.contrasenaActual) = '" + pwd.toUpperCase() + "'";
            hqsql += " and  (p.empresa = " + empresa + " or p.id = " + idUsuarioSystem + ")";

            List<UsuarioDto> usuarios = springHibernateDao.ejecutarQuery(hqsql, listaParametros);
            if (usuarios != null && usuarios.size() > 0) {
                retorno = usuarios.get(0);
            } else {
                retorno = null;
            }

        } catch (DAOException ex) {
            logger.error(ex);
            retorno = null;
        }

        return retorno;
    }

    /**
     * Valida si el email de un usuario ya se encuentra en el sistema o no
     *
     * @param usuarioDto Usuario a validar
     * @return verdadero (es vàlido porque no se encuentra) o falso (no es
     * valido porque ya se encuentra)
     */
    public boolean esValidoEmail(UsuarioDto usuarioDto) {
        boolean retorno = false;
        try {

            List<Object> listaParametros = new ArrayList<Object>();
            String hqsql = "select p from UsuarioDto as p where ";
            hqsql += " upper(p.emailLaboral) = '" + usuarioDto.getEmailLaboral().toUpperCase() + "'";
            if (usuarioDto.getId() != null) {
                hqsql += " and p.id != " + usuarioDto.getId();
            }

            List<UsuarioDto> usuarios = springHibernateDao.ejecutarQuery(hqsql, listaParametros);
            if (usuarios != null && usuarios.size() > 0) {
                retorno = false;
            } else {
                retorno = true;
            }

        } catch (DAOException ex) {
            logger.error(ex);
            retorno = false;
        }

        return retorno;
    }

    /**
     * Retorna los usuarios de acuerdo a un filtro de condiciones
     *
     * @param dtoFiltro filtro
     * @return Lista de Usuarios
     * @throws DAOException
     */
    public List<UsuarioDto> obtener(UsuarioDto dtoFiltro) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from UsuarioDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }
        if (dtoFiltro.getDescripcion() != null && dtoFiltro.getDescripcion().length() != 0) {
            hqsql += " and upper(e.descripcion) like '%" + dtoFiltro.getDescripcion().toUpperCase() + "%'";
        }

        if (dtoFiltro.getLogin() != null && dtoFiltro.getLogin().length() != 0) {
            hqsql += " and upper(e.login) like '%" + dtoFiltro.getLogin().toUpperCase() + "%'";
        }

        if (!dtoFiltro.getRolDto().getId().equals(rolManager.getRolTodos()) && dtoFiltro.getRolDto().getDescripcion() != null && dtoFiltro.getRolDto().getDescripcion().length() != 0) {
            hqsql += " and e.rolDto = ?";
            listaParametros.add(dtoFiltro.getRolDto());
        }

        hqsql += " and e.id not in (?)";
        listaParametros.add(idUsuarioSystem);
        //listaParametros.add(usuarioTodos);
        if (!sessionMBean.getSessionUsuarioDto().getRolDto().getId().equals(sessionMBean.getRolSystem())) {
            hqsql += " and e.rolDto.usuarioDefault <> ?";
            listaParametros.add(Boolean.TRUE);
            hqsql += " and e.empresa = ?";
            listaParametros.add(sessionMBean.getEmpresaDto().getId());
        }
        //Agregamos la condicion que valida propietarios
        if (!sessionMBean.getSessionUsuarioDto().getRolDto().getId().equals(sessionMBean.getRolSystem())) {
            if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
                if (!sessionMBean.getSessionUsuarioDto().getRolDto().getUsuarioDefault()) {
                    hqsql += " and exists(select 'X' from PropietarioDto as prop ";
                    hqsql += "where prop.pk.organizacionDto.id = ? ";
                    hqsql += " and prop.pk.entidad = ? ";
                    hqsql += " and prop.pk.registro = e.id)";
                    listaParametros.add(sessionMBean.getOrganizacionDto().getId());
                    listaParametros.add(IdEntidad);
                }
            }
        }
        ////////////////////////////////////////////////////
        hqsql += " order by e.descripcion asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Retorna todos los usuarios activos
     *
     * @return Lista de Usuarios
     * @throws DAOException
     */
    public List<UsuarioDto> obtenerTodosActivos() throws DAOException {
        List<UsuarioDto> l = null;
        List<UsuarioDto> result = new ArrayList<UsuarioDto>();
        l = this.obtenerTodos();
        for (UsuarioDto x: l) {
            if (x.getEstado()) {
                result.add(x);
            }
        }
        return result;
    }

    /**
     * Este metodo obtiene los usuario que sean empleados
     *
     * @param sqr
     * @return
     * @throws DAOException
     */
    public List<UsuarioDto> obtenerUsuariosQueSeanEmpleadosCMAC(final String sqr) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from UsuarioDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        hqsql += " and (upper(e.descripcion) like '%" + sqr.toUpperCase() + "%'";

        hqsql += " or upper(e.login) like '%" + sqr.toUpperCase() + "%'";

        hqsql += " or upper(e.rolDto.descripcion) like '%" + sqr.toUpperCase() + "%')";

        hqsql += " and exists( select 'X' from PersonaDto as p where p.usuarioSistemaDto.id = e.id  and p.emp = 1)";

        hqsql += " and e.empresa= ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());

        //Agregamos la condicion que valida propietarios
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            hqsql += " and exists(select 'X' from PropietarioDto as prop ";
            hqsql += " where prop.pk.organizacionDto.id = ? ";
            hqsql += " and prop.pk.entidad = ? ";
            hqsql += " and prop.pk.registro = e.id  and prop.estado = ?)";
            listaParametros.add(sessionMBean.getOrganizacionDto().getId());
            listaParametros.add(IdEntidad);
            listaParametros.add(Boolean.TRUE);
        }

        hqsql += " order by e.descripcion asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Retorna usuarios de acuerdo a una cadena que compara con la descripcion o
     * el login de usuario o la descripcion del rol
     *
     * @param sqr cadena
     * @return Lista de Usuarios
     * @throws DAOException
     */
    public List<UsuarioDto> obtener(final String sqr) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from UsuarioDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        hqsql += " and (upper(e.descripcion) like '%" + sqr.toUpperCase() + "%'";

        hqsql += " or upper(e.login) like '%" + sqr.toUpperCase() + "%'";

        hqsql += " or upper(e.rolDto.descripcion) like '%" + sqr.toUpperCase() + "%')";

        hqsql += " and e.empresa= ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());

        //Agregamos la condicion que valida propietarios
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            hqsql += " and exists(select 'X' from PropietarioDto as prop ";
            hqsql += "where prop.pk.organizacionDto.id = ? ";
            hqsql += " and prop.pk.entidad = ? ";
            hqsql += " and prop.pk.registro = e.id  and prop.estado = ?)";
            listaParametros.add(sessionMBean.getOrganizacionDto().getId());
            listaParametros.add(IdEntidad);
            listaParametros.add(Boolean.TRUE);
        }

        hqsql += " order by e.descripcion asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<UsuarioDto> obtenerSystemPorEmpresa(EmpresaDto empDto) throws DAOException {

        String hqsql = "select e from UsuarioDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();
        hqsql += " and e.rolDto.usuarioDefault = ? ";
        hqsql += " and e.empresa = ?";
        listaParametros.add(Boolean.TRUE);
        listaParametros.add(empDto.getId());
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<UsuarioDto> autoCompletarUsuariosPorEmpresa(final String sqr) throws DAOException {

        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from UsuarioDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        hqsql += " and (upper(e.descripcion) like '%" + sqr.toUpperCase() + "%'";

        hqsql += " or upper(e.login) like '%" + sqr.toUpperCase() + "%'";

        hqsql += " or upper(e.rolDto.descripcion) like '%" + sqr.toUpperCase() + "%')";

        hqsql += " and e.empresa= ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            hqsql += " and exists(select 'X' from PropietarioDto as prop ";
            hqsql += "where prop.pk.organizacionDto.id = ? ";
            hqsql += " and prop.pk.entidad = ? ";
            hqsql += " and prop.pk.registro = e.id  and prop.estado = ?)";
            listaParametros.add(sessionMBean.getOrganizacionDto().getId());
            listaParametros.add(IdEntidad);
            listaParametros.add(Boolean.TRUE);
        }
        hqsql += " order by e.descripcion asc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }
    
    public List<UsuarioDto> autoCompletarUsuario(final String query) throws DAOException{
        String hqsql = "select e from UsuarioDto as e where e.id=e.id";
        hqsql += " and (upper(e.descripcion) like '%" + query.toUpperCase() + "%'";
        hqsql += " or upper(e.login) like '%" + query.toUpperCase() + "%'";
        hqsql += " or upper(e.rolDto.descripcion) like '%" + query.toUpperCase() + "%')";
        hqsql += " order by e.descripcion asc";
        
        return springHibernateDao.ejecutarQuery(hqsql);
    }

    /**
     * Valida si un usuario se puede crear o no
     *
     * @param usuarioDto Usuario a crear
     * @return verdadero (si se puede crear) o false (no se puede crear)
     */
    public boolean usuarioEsValido(UsuarioDto usuarioDto) {
        boolean retorno = true;
        if (!esValidoLogin(usuarioDto)) {
            recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("usuario.login.ya.existe"));
            retorno = false;
        }

        if (usuarioDto.getEmailLaboral() != null) {
            if (!esValidoEmail(usuarioDto)) {
                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("usuario.email.ya.existe"));
                retorno = false;
            }
        }
        return retorno;
    }

    public UsuarioDto inicializar() {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        UsuarioDto dto = new UsuarioDto();
        dto.setEstado(Boolean.TRUE);
        dto.setEmpresa(sessionMBean.getEmpresaDto().getId());
        return dto;
    }

    /**
     * Envia un correo al email del usuario que se ha creado
     *
     * @param usuario Usuario Creado
     * @return 1 email enviado 0 email no enviado
     */
    public int enviarEmail(UsuarioDto usuario, String proviene) {
        int retorno = -1;
        CorreoElectronicoManager managerEmail = (CorreoElectronicoManager) WebServletContextListener.getApplicationContext().getBean("correoElectronicoManager");
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");
        CorreoDto dto = new CorreoDto();
        dto.setAsunto(applicationMBean.getNombreSistema());
        dto.setCuerpo(formatoCorreoNuevoUsuario(usuario));
        String[] to = new String[1];
        try {
            if (proviene.equals("E")) {
                ParametroManager parametroManager = (ParametroManager) WebServletContextListener.getApplicationContext().getBean("parametroManager");
                String emailSU = parametroManager.obtenerPorId(ConstantesCore.Parametro.PARAMETRO_EMAIL_SUPER_USUARIO).getValorCadena();
                if (emailSU != null && emailSU.length() != 0) {
                    to[0] = emailSU;
                }
            } else if (proviene.equals("U")) {
                to[0] = usuario.getEmailLaboral();
            }
            dto.setTo(to);

            retorno = managerEmail.enviar(dto);
            return retorno;
        } catch (DAOException ex) {
            recursosManager.showError(ex.getMessage());
            return 0;

        } catch (UnsupportedEncodingException ex) {
            recursosManager.showError(ex.getMessage());
            return 0;

        } catch (MessagingException ex) {
            recursosManager.showError(ex.getMessage());
            return 0;
        } catch (ServiceException ex) {
            recursosManager.showError(ex.getMessage());
            return 0;
        }
    }

    /**
     * Retorna el formato de correo en html
     *
     * @param usuarioDto usuario
     * @return formato de correo
     */
    private String formatoCorreoNuevoUsuario(UsuarioDto usuarioDto) {
        String retorno = null;
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");
        HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();

        StringBuffer mensaje = new StringBuffer();
        mensaje.append("<html>");
        mensaje.append("<head>");
        mensaje.append("	<style>");
        mensaje.append("		* {");
        mensaje.append("			font-size: 100%;");
        mensaje.append("			font-family: Tahoma, Lucida Grande, Lucida Sans, Arial, sans-serif;");
        mensaje.append("			letter-spacing: .03em;");
        mensaje.append("		}");
        mensaje.append("		body {");
        mensaje.append("			font-size: 0.7em;");
        mensaje.append("			overflow: auto;");
        mensaje.append("			padding: 4px;");
        mensaje.append("			margin: 4px;");
        mensaje.append("		}");
        mensaje.append("		  table.dataTable tr td");
        mensaje.append("		, table.dataTable tr th");
        mensaje.append("		, table.dataTable tr td.last");
        mensaje.append("		, table.dataTable tr th.last");
        mensaje.append("		, table.dataTable tr.last td");
        mensaje.append("		, table.dataTable tr.last th {");
        mensaje.append("			border-left:1px solid #000;");
        mensaje.append("			border-top:1px solid #000;");
        mensaje.append("			padding:2px;");
        mensaje.append("			margin:2px;");
        mensaje.append("		}");
        mensaje.append("		  table.dataTable tr td.last");
        mensaje.append("		, table.dataTable tr th.last {");
        mensaje.append("			border-right:1px solid #000;");
        mensaje.append("		}");
        mensaje.append("		  table.dataTable tr.last td");
        mensaje.append("		, table.dataTable tr.last th {");
        mensaje.append("			border-bottom:1px solid #000;");
        mensaje.append("		}");
        mensaje.append("	</style>");
        mensaje.append("</head>");
        /*CUERPO DE MENSAJE*/
        mensaje.append("<body>");
        /*TITULO DEL MENSAJE*/
        mensaje.append("<hr/>");
        mensaje.append("<b style='font-size: 115%;'><center>" + applicationMBean.getNombreSistema() + " : NUEVO USUARIO</center></b>");
        mensaje.append("<hr/>");
        mensaje.append("<br>");
        mensaje.append("Estimado " + usuarioDto.getDescripcion() + " se ha creado un usuario para el sistema : " + applicationMBean.getNombreSistema() + " su credenciales son las siguientes para acceder al sistema:");
        mensaje.append("<br>");

        mensaje.append("<table>");

        mensaje.append("	<tr>");
        mensaje.append("		<td>USUARIO :</td>");
        mensaje.append("		<td>&nbsp;:&nbsp;&nbsp;<b>" + usuarioDto.getLogin() + "</b></td>");
        mensaje.append("	</tr>");
        mensaje.append("	<tr>");
        mensaje.append("		<td>CONTRASEÑA</td>");
        mensaje.append("		<td>&nbsp;:&nbsp;&nbsp;<b>" + usuarioDto.getContrasenaActual() + "</b></td>");
        mensaje.append("	</tr>");
        mensaje.append("	<tr>");
        mensaje.append("		<td>ROL :</td>");
        mensaje.append("		<td>&nbsp;:&nbsp;&nbsp;<b>" + usuarioDto.getRolDto().getDescripcion() + "</b></td>");
        mensaje.append("	</tr>");
        mensaje.append("	<tr>");
        mensaje.append("		<td>URL APLICACIÓN</td>");
        mensaje.append("		<td>&nbsp;:&nbsp;&nbsp;<b>" + request.getContextPath() + "</b></td>");
        mensaje.append("	</tr>");
        mensaje.append("</table>");
        mensaje.append("</body>");
        mensaje.append("</html>");

        return mensaje.toString();
    }

    /**
     * Retorna los privilegios de las opciones por el rol del usario
     *
     * @param usuarioDto usuario
     * @return Mapa de permisos
     */
    public static Map<String, Boolean> obtenerPrivilegiosUsuario(UsuarioDto usuarioDto) {
        Map<String, Boolean> privilegiosOpciones = new HashMap<String, Boolean>();

        PermisoRolManager permisoRolManager = (PermisoRolManager) WebServletContextListener.getApplicationContext().getBean("permisoRolManager");

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("rolDto.id", usuarioDto.getRolDto().getId());
        map.put("opcionSistemaDto.tipoMenu", "O");
        Map<String, String> order = new HashMap<String, String>();
        order.put("opcionSistemaDto.orden", "asc");
        order.put("opcionSistemaDto.descripcion", "asc");
        List<PermisoRolDto> listaPermisos = null;
        try {
            listaPermisos = permisoRolManager.obtenerConFiltroConOrden(map, order);
        } catch (DAOException ex) {
            logger.error(ex);
        }

        for (PermisoRolDto p : listaPermisos) {
            privilegiosOpciones.put(p.getOpcionSistemaDto().getId().toString(), p.getEstado());
        }


        return privilegiosOpciones;
    }

    public void editarEmail(UsuarioDto usuarioDto) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        usuarioDto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
        usuarioDto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
        usuarioDto.setTerminal(sessionMBean.getSessionTerminal());
        editar(usuarioDto);
    }

    public String guardar(UsuarioDto dto) {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");
        ParametroManager parametroManager = (ParametroManager) WebServletContextListener.getApplicationContext().getBean("parametroManager");
        String to = null;
        String mensajeTrx = "";
        if (usuarioEsValido(dto)) {
            {
                dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
                dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
                dto.setTerminal(sessionMBean.getSessionTerminal());
            }


            if (sessionMBean.getAccion() == applicationMBean.getNuevo()) {
                try {
                    int rEnvio = 1;
                    if (parametroManager.obtenerPorId(ConstantesCore.Parametro.PARAMETRO_NOTIFIC_ENVIAR_EMAIL_CREAR_USUARIO).getValorBoolean()) {
                        rEnvio = enviarEmail(dto, "U");
                    }
                    if (rEnvio == 1) {
                        //if (true) {
                        dto.setUsuarioCreacionDto(sessionMBean.getSessionUsuarioDto());
                        dto.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
                        dto.setTerminalCreacion(sessionMBean.getSessionTerminal());
                        dto.setContrasenaActual(UtilCore.Seguridad.encriptarTexto(dto.getContrasenaActual().toUpperCase()));
                        UtilCore.General.toUpperCaseDto(dto);
                        nuevo(dto);
                        //Registramos como propietario de la organizacion que esta en sesion
                        generarPropietarioPorDefault(dto);
                        sessionMBean.setAccion(applicationMBean.getEditar());
                        mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                        recursosManager.showMessage(mensajeTrx);
                        to = null;
                    } else {
                        return null;
                    }
                } catch (Exception ex) {
                    recursosManager.showError(ex.getMessage());
                    to = null;
                }
            } else if (sessionMBean.getAccion() == applicationMBean.getEditar()) {
                try {
                    UtilCore.General.toUpperCaseDto(dto);
                    editar(dto);
                    mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                    recursosManager.showMessage(mensajeTrx);
                    to = null;
                } catch (Exception ex) {
                    recursosManager.showError(ex.getMessage());
                    ex.getStackTrace();
                    to = null;
                }
            }
        } else {
            to = null;
        }
        return to;
    }

    public void generarPropietarioPorDefault(UsuarioDto dto) {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        sessionMBean.setEntidad(IdEntidad);
        sessionMBean.setRegistro(dto.getId());
        PropietarioMBean propietarioMBean = (PropietarioMBean) WebServletContextListener.getApplicationContext().getBean("propietarioMBean");
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            propietarioMBean.setOrganizacionDto(sessionMBean.getOrganizacionDto());
            propietarioMBean.setEstado(Boolean.TRUE);
            propietarioMBean.setPrincipal(Boolean.TRUE);
            propietarioMBean.nuevoPropietario();
        }
    }

    public String guardarContrasena(UsuarioDto dto, String contrasenaNueva, String contrasenaVerificar) {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String to = null;
        String mensajeTrx = "";

        {
            dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
            dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
            dto.setTerminal(sessionMBean.getSessionTerminal());
        }
        String cActual = sessionMBean.getSessionUsuarioDto().getContrasenaActual();
        String cActualIngresada = UtilCore.Seguridad.encriptarTexto(dto.getContrasenaAnterior().toUpperCase()).toUpperCase();


        if (cActual.equals(cActualIngresada)) {
            if (contrasenaNueva.toUpperCase().equals(contrasenaVerificar.toUpperCase())) {
                try {
                    dto.setContrasenaActual(UtilCore.Seguridad.encriptarTexto(contrasenaNueva.toUpperCase()));
                    UtilCore.General.toUpperCaseDto(dto);
                    editar(dto);
                    mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                    recursosManager.showMessage(mensajeTrx);
                    to = null;
                } catch (Exception ex) {
                    recursosManager.showError(ex.getMessage());
                    to = null;
                }
            } else {
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("usuario.msj.verificar.contrasena");
                recursosManager.showWarning(mensajeTrx);
                to = null;
            }
        } else {
            mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("usuario.label.contrasena.anterior.error");
            recursosManager.showWarning(mensajeTrx);
            to = null;
        }



        return to;
    }

    public String guardarContrasenaFormateada(UsuarioDto dto) {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String to = null;
        String mensajeTrx = "";
        {
            dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
            dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
            dto.setTerminal(sessionMBean.getSessionTerminal());
        }

        if (dto.getContrasenaActual().toUpperCase().equals(dto.getContrasenaVerificar().toUpperCase())) {
            try {
                dto.setContrasenaActual(UtilCore.Seguridad.encriptarTexto(dto.getContrasenaActual().toUpperCase()));
                dto.setComentario("Formateo de Contraseña");
                UtilCore.General.toUpperCaseDto(dto);
                editar(dto);
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                recursosManager.showMessage(mensajeTrx);
                to = null;
            } catch (Exception ex) {
                recursosManager.showError(ex.getMessage());
                to = null;
            }
        } else {
            mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("usuario.msj.verificar.contrasena");
            recursosManager.showWarning(mensajeTrx);
            to = null;
        }

        return to;
    }
    
    public List<UsuarioDto> obtenerGestoresActivos() throws DAOException{
        List<UsuarioDto> lista = new ArrayList<UsuarioDto>();
        List<UsuarioDto> result = new ArrayList<UsuarioDto>();
        lista = this.obtenerTodosActivos();
        if (lista != null) {
            for (UsuarioDto x: lista) {
                if (x.getRolDto().getDescripcion().equals("GESTOR")) {
                    result.add(x);
                }
            }
        }
        return result;
    }

    public DAOGenerico<UsuarioDto> getSpringHibernateDao() {
        return springHibernateDao;
    }

    public void setSpringHibernateDao(DAOGenerico<UsuarioDto> springHibernateDao) {
        this.springHibernateDao = springHibernateDao;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public Long getIdUsuarioSystem() {
        return idUsuarioSystem;
    }

    public Long getIdEntidad() {
        return IdEntidad;
    }

    public UsuarioDto getUsuarioSystem() {
        try {
            return obtenerPorId(idUsuarioSystem);
        } catch (DAOException ex) {
            logger.error(ex);
            return null;
        }
    }

    public void setUsuarioSystem(UsuarioDto usuarioSystem) {
        this.usuarioSystem = usuarioSystem;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        UsuarioManager.logger = logger;
    }

    public String getUrlUsuarioFormatearContrasena() {
        return urlUsuarioFormatearContrasena;
    }

    public String getUrlUsuarioCambiarContrasena() {
        return urlUsuarioCambiarContrasena;
    }

    public String getUrlUsuario() {
        return urlUsuario;
    }

    public String getUrlListaUsuarios() {
        return urlListaUsuarios;
    }

    public Long getUsuarioTodos() {
        return usuarioTodos;
    }

    public String getLogin() {
        return login;
    }

    public String getContrasenia() {
        return contrasenia;
    }

    public String getUsuarioDesc() {
        return usuarioDesc;
    }
}
